Skip to content

ROS2 Launch 文件 ​

Launch 文件概念讲解 ​

说明核心概念 Launch 文件是 ROS 2 中用于自动化启动和管理多个节点的脚本文件。

1. 什么是 Launch 文件 ​

Launch 文件(启动文件) 是 ROS 2 中用于描述系统启动过程的配置文件。它允许用户在一个文件中定义需要启动的节点、设置参数、配置命名空间、重映射话题等,然后通过一条命令启动整个系统。

简单来说,Launch 文件就是一个"启动脚本",它告诉 ROS 2:

  • 需要启动哪些节点
  • 每个节点的参数是什么
  • 节点之间的话题如何映射
  • 节点应该在哪个命名空间下运行

2. 为什么需要 Launch 文件 ​

在实际的机器人系统中,通常需要同时运行多个节点协同工作。如果手动逐个启动节点,会非常繁琐且容易出错。

Launch 文件的主要优势包括:

  • 一键启动:通过一条命令启动多个节点,简化操作流程
  • 参数配置:在启动时为节点设置参数,无需修改代码
  • 话题重映射:灵活调整节点之间的话题连接关系
  • 命名空间管理:避免节点和话题名称冲突
  • 条件启动:根据条件决定是否启动某个节点
  • 可复用性:Launch 文件可以包含其他 Launch 文件,便于模块化

3. Launch 文件支持的格式 ​

ROS 2 支持三种格式的 Launch 文件:

格式扩展名特点
Python.launch.py最常用,功能最强大,支持复杂逻辑和条件判断
XML.launch.xml结构清晰,易于阅读,适合简单配置
YAML.launch.yaml简洁易读,适合静态配置

说明推荐 Python 格式是最推荐的格式,因为它最灵活,支持条件判断、循环等复杂逻辑。

4. Python Launch 文件的基本结构 ​

一个典型的 Python Launch 文件包含以下基本结构:

python
from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():
    """生成启动描述"""
    return LaunchDescription([
        # 在这里定义要启动的节点
        Node(
            package='包名',
            executable='可执行文件名',
            name='节点名称',
            output='screen',
            parameters=[{'参数名': 参数值}],
        ),
        # 可以继续添加更多节点...
    ])

关键组成部分说明: ​

  • LaunchDescription:Launch 文件的顶层容器,包含所有要执行的动作
  • Node:表示一个要启动的 ROS 2 节点
  • generate_launch_description():必须的入口函数,返回 LaunchDescription 对象

5. Launch 文件与功能包的关系 ​

Launch 文件通常放在功能包的 launch/ 目录下:

text
my_package/
├── package.xml
├── setup.py
├── resource/
├── my_package/
│   └── __init__.py
│   └── node1.py
│   └── node2.py
└── launch/
    └── my_launch.launch.py

为了让 ros2 launch 命令能找到 Launch 文件,需要在 setup.py 中配置:

python
import os
from glob import glob
from setuptools import setup

package_name = 'my_package'

setup(
    name=package_name,
    version='0.0.0',
    # ... 其他配置 ...
    data_files=[
        ('share/ament_index/resource', ['resource/' + package_name]),
        # 关键配置:安装 launch 文件
        (os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
    ],
)

6. 参数与 Launch 文件的关系 ​

Launch 文件与参数系统紧密配合,可以在启动节点时设置参数:

python
Node(
    package='my_package',
    executable='my_node',
    parameters=[{
        'param_name_1': 'value_1',
        'param_name_2': 42,
        'param_name_3': True,
    }],
)

也可以从 YAML 文件加载参数:

python
import os
from ament_index_python.packages import get_package_share_directory

config = os.path.join(
    get_package_share_directory('my_package'),
    'config',
    'params.yaml'
)

Node(
    package='my_package',
    executable='my_node',
    parameters=[config],
)

学习内容4:Launch 文件实践 ​

下面通过一个实际案例来学习如何创建和使用 Launch 文件。我们将创建一个倒计时节点,并通过 Launch 文件启动它。

第一步:创建 launch 目录 ​

在功能包目录下创建 launch 目录:

bash
# 在功能包目录下执行
mkdir launch

第二步:创建 countdown.launch.py 文件 ​

在 launch 目录下创建 Launch 文件:

python
from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():
    """生成启动描述"""
    return LaunchDescription([
        # 启动倒计时节点
        Node(
            package='lq_pkg1',           # 功能包名
            executable='countdown_node',   # 可执行文件名(在 setup.py 中配置)
            name='countdown_node',         # 节点名称
            output='screen',               # 输出到屏幕
            parameters=[{
                'countdown_time': 10,      # 倒计时时间参数
            }],
        ),
    ])

第三步:修改 setup.py ​

在功能包的 setup.py 中添加 launch 文件的安装配置:

python
import os
from glob import glob
from setuptools import find_packages, setup

package_name = 'lq_pkg1'

setup(
    name=package_name,
    version='0.0.0',
    packages=find_packages(exclude=['contrib', 'docs', 'tests']),
    data_files=[
        ('share/ament_index/resource', ['resource/' + package_name]),
        (os.path.join('share', package_name), ['package.xml']),
        # 添加这行:安装 launch 文件
        (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='Your Name',
    maintainer_email='your_email@example.com',
    description='ROS2 Python package',
    license='TODO',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'countdown_node = lq_pkg1.countdown:main',
        ],
    },
)

第四步:编译工作空间 ​

⚠️ 警告注意 编译前请确保处于工作空间的根目录下。

bash
# 回到工作空间根目录
cd ~/ros_code/lq_ws

# 编译
colcon build

第五步:运行 Launch 文件 ​

首先加载环境:

bash
source install/setup.bash

然后运行 Launch 文件:

bash
# 命令格式:ros2 launch 包名 launch文件名
ros2 launch lq_pkg1 countdown.launch.py

第六步:用命令行验证 Launch 效果 ​

保持 Launch 文件运行的终端,新开一个终端,加载环境后查看节点:

bash
source install/setup.bash
ros2 node list

可以看到启动的节点名称。

查看节点的参数:

bash
ros2 param list /countdown_node

查看参数的值:

bash
ros2 param get /countdown_node countdown_time

说明总结 通过 Launch 文件,我们可以一次性启动多个节点,并为它们配置参数。这大大简化了复杂系统的启动过程。